package com.mfz.common.units

import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.core.util.Loader
import java.io.File
import java.math.BigDecimal
import java.nio.charset.Charset
import java.util.*

val logger = LogManager.getLogger("com.mfz.common.units")!!

/**
 * 根据给定的编码，从文件中读取字符串.
 *
 * 如果文件未找到，将记录一个异常，但直接返回"".
 * 而不是弹出异常
 *
 * @param fileName 文件名
 * @param charset      指定文件的编码格式
 * *
 * @RETURN 读取到的字符串
 */
fun readFileContentByString(fileName: String, charset: Charset = Charsets.UTF_8): String {
	logger.debug("以 $charset 格式读文件: $fileName。")

	return try {
		val fullPath = Loader.getResource(fileName, Loader::class.java.classLoader).file
		File(fullPath).readText(charset)
	} catch (e: Exception) {
		logger.error("读文件$fileName 出现异常，原因：", e)
		""
	}
}


/**
 * 从其他类型得到Double类型
 */
fun getDouble(value: Any?): Double? {
	if (value == null) return null

	return when (value) {
		is Double -> value
		is Int -> value.toDouble()
		is BigDecimal -> value.toDouble()
		is Long -> value.toDouble()
		is String -> value.toDouble()
		else -> value.toString().toDouble()
	}
}

/**
 * 返回Int值的第N位的值，可以指定多个。
 */
fun Int.takeBitValue(vararg bits: Int): Int {
	var template = 0
	var minBit = Int.MAX_VALUE
	for (it in bits) {
		template = template or (1 shl it)
		if (minBit > it) minBit = it
	}

	return (this and template) ushr minBit
}


/**
 * 返回指定相应值所在位置后的Int值,需要指明最低位的长
 */
fun Int.setBitValue(bits: Int): Int {
	return this shl bits
}


/**
 * 为date增加一个与当前时间的比较方法
 * 大于等于的时候返回 true
 */
fun Date.compareCurrent(): Boolean {
	return this.time >= System.currentTimeMillis()
}

